#include <stdio.h>
#include <termios.h>//结构体头文件
#include <string.h>//bzero头文件
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "JY61P.h"


/* 设置串口参数的函数 */
int set_uart(int fd, int speed, int bits, char check, int stop) {
    struct termios newtio, oldtio;//speed波特率、bits数据位、check校验位、stop停止位
    //定义两个结构体 之前的配置/新设置的配置
    // 步骤一：保存原来的串口配置
    if(tcgetattr(fd, &oldtio) != 0) {
        printf("tcgetattr oldtio error\n");//保存失败
        return -1;//返回值（判断是否配置成功 ）
    }

    bzero(&newtio, sizeof(newtio));//结构体清零
    
    // 步骤二：设置控制模式标志
    newtio.c_cflag |= CLOCAL | CREAD;//本地连接、使能读
    newtio.c_cflag &= ~CSIZE;//清零（与操作、取反）

    // 步骤三：设置数据位（可选数据位）
    switch(bits) {
        case 7:
            newtio.c_cflag |= CS7;
            break;
        case 8:
            newtio.c_cflag |= CS8;
            break;
    }
    
    // 步骤四：设置奇偶校验位
    switch(check) {
        case 'O': // 奇校验位
            newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
            newtio.c_iflag |= (INPCK | ISTRIP);
            break; 
        case 'E': // 偶校验位
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;//清零
            newtio.c_iflag |= (INPCK | ISTRIP);
            break;
        case 'N': // 无校验
            newtio.c_cflag &= ~PARENB;//大部分情况
            break;
    }
    
    // 步骤五：设置波特率
    switch(speed) {
        case 9600:
            cfsetispeed(&newtio, B9600);//设置输入波特率
            cfsetospeed(&newtio, B9600);//设置输出波特率
            break;
        case 115200:
            cfsetispeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
            break;
    }
    
    // 步骤六：设置停止位
    switch(stop) {
        case 1:
            newtio.c_cflag &= ~CSTOPB; // 1位停止位
            break;
        case 2:
            newtio.c_cflag |= CSTOPB; // 2位停止位  
            break;
    }
    
    // 步骤七：刷新输入队列
    tcflush(fd, TCIFLUSH);
    
    // 步骤八：设置配置立刻生效
    if (tcsetattr(fd, TCSANOW, &newtio) != 0) {
        printf("tcsetattr newtio error\n");
        return -2;
    }
    
    return 0;
}

